package algo3c3g3.model.action;

import algo3c3g3.model.*;
import org.jdom.Element;

import algo3c3g3.model.persistence.Persistence;

/**
 * La unidad camina normalmente. Si se cae lo hace en forma segura
 * y no es destruida al chocar con el piso.
 */
public class Floater extends Walker
{
    private boolean falled;
    
    @Override
    public void perform(Unit unit)
    {
        // Ejecuta perform() de Walker.
        super.perform(unit);
        
        // Si cayo y hay piso vuelve a ser Walker.
        if((falled) && (unit.overSolidFloor()))
            unit.setAction(new Walker());
    }
    
    @Override
    protected void walkDownOrFall(Unit unit)
    {
        /*
         * Este metodo esta redefinido de modo que al
         * llamar a super.perform() se ejecute esta version de
         * walkDownOrFall().
         */
        
        unit.fall();
            
        if(!falled)
            System.out.println("\nCayendo en modo Floater:\n");

        falled = true;
        return;
    }
    
    @Override
    public Element save()
    {
        Element root = super.save();

        Element e = new Element("falled");
        e.addContent(Boolean.toString(this.falled));
        root.addContent(e);

        return root;
    }

    @Override
    public void load(Element e)
    {
        this.falled =
            new Boolean(e.getChildText("falled")).booleanValue();
    }

    
    
    public static void main(String[] args)
    {
        System.out.println();
        
        World world = new World(new Coord(1, 2), null, new TestMaps.TestFallerMap());
        
        System.out.println("Mapa:");
        world.printMap();
        
        world.addUnit();
        
        Unit unit1 = world.getUnit(0);
        
        System.out.println("\nNueva unidad:");
        unit1.printStatus();
        
        System.out.println("\nCambia a Floater:");
        Floater floater=new Floater();
        unit1.setAction(floater);
        
        System.out.println("\nCaminando:");
        for(int i = 0; i < 20; i++)
        {
            world.moveUnits();
            unit1.printStatus();
        }
        
        System.out.println();
        Persistence.toXMLFile(floater.save(),"C:\\salida.xml");
    }
}
